/* * Copyright (C) 2008 Digital Sundhed (SDSD) * * All source code and information supplied as part of chronos * is copyright to its contributers. * * The source code has been released under a dual license - meaning you can * use either licensed version of the library with your code. * * It is released under the Common Public License 1.0, a copy of which can * be found at the link below. * http://www.opensource.org/licenses/cpl.php * * It is released under the LGPL (GNU Lesser General Public License), either * version 2.1 of the License, or (at your option) any later version. A copy * of which can be found at the link below. * http://www.gnu.org/copyleft/lesser.html */ package org.codehaus.mojo.chronos.chart; import java.awt.Color; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; import org.codehaus.mojo.chronos.gc.GCSamples; import org.codehaus.mojo.chronos.responsetime.ResponsetimeSamples; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.DateAxis; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.axis.ValueAxis; import org.jfree.chart.plot.CombinedDomainXYPlot; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.plot.ValueMarker; import org.jfree.chart.plot.XYPlot; import org.jfree.chart.renderer.xy.StandardXYItemRenderer; import org.jfree.data.time.TimeSeries; import org.jfree.data.time.TimeSeriesCollection; import org.jfree.data.xy.XYDataset; import org.jfree.ui.RectangleAnchor; import org.jfree.ui.TextAnchor; /** * Utilityclass to assist in generating charts. * * @author ksr@lakeside.dk */ public class ChartUtil { private static final double GAP = 10D; private static final double MARGIN = 0.02D; public static List createDefaultPlugins(ResponsetimeSamples samples, GCSamples gcSamples) { List plugins = new ArrayList(); plugins.add(new ChronosResponsetimePlugin(samples)); plugins.add(new ChronosHistogramPlugin(samples)); plugins.add(new ChronosThroughputPlugin(samples)); plugins.add(new ChronosGCPlugin(gcSamples)); return plugins; } public static void addDomainMarker(XYPlot xyplot, String label, double value) { xyplot.addDomainMarker(addValueMarker(label, value, true)); } public static void addRangeMarker(XYPlot xyplot, String label, double value) { xyplot.addRangeMarker(addValueMarker(label, value, false)); } /** * Generate a {@link ValueMarker}. */ private static ValueMarker addValueMarker(String text, double x, boolean domain) { ValueMarker marker = new ValueMarker(x); marker.setPaint(Color.GRAY); marker.setLabel(text); if(domain) { marker.setLabelAnchor(RectangleAnchor.TOP_LEFT); marker.setLabelTextAnchor(TextAnchor.TOP_RIGHT); } else { marker.setLabelAnchor(RectangleAnchor.TOP_RIGHT); marker.setLabelTextAnchor(TextAnchor.BOTTOM_RIGHT); } return marker; } public static XYPlot setupXYPlot(JFreeChart chart, DateFormat dateFormat) { XYPlot plot = chart.getXYPlot(); DateAxis axis = (DateAxis)plot.getDomainAxis(); axis.setDateFormatOverride(dateFormat); NumberAxis rangeAxis = (NumberAxis)plot.getRangeAxis(); rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); return plot; } /* Method merged from Atlassion */ public static XYPlot setUpperBound(JFreeChart chart, double max) { XYPlot plot = chart.getXYPlot(); ValueAxis axis = (ValueAxis)plot.getDomainAxis(); axis.setUpperBound(max); return plot; } static CombinedDomainXYPlot createCombinedPlot(DateAxis timeAxis, XYPlot xyplot1, XYPlot xyplot2) { CombinedDomainXYPlot combineddomainxyplot = new CombinedDomainXYPlot(timeAxis); combineddomainxyplot.setGap(GAP); combineddomainxyplot.add(xyplot1, 2); combineddomainxyplot.add(xyplot2, 1); combineddomainxyplot.setOrientation(PlotOrientation.VERTICAL); return combineddomainxyplot; } public static XYPlot newPlot(TimeSeries timeSeries, String label, boolean forceIncludeZero) { XYDataset dataset = asDataset(timeSeries); return newPlot(dataset, label, forceIncludeZero); } static XYPlot newPlot(XYDataset dataset, String label, boolean forceIncludeZero) { StandardXYItemRenderer standardxyitemrenderer = new StandardXYItemRenderer(); NumberAxis numberaxis = new NumberAxis(label); numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); numberaxis.setAutoRangeIncludesZero(forceIncludeZero); return new XYPlot(dataset, null, numberaxis, standardxyitemrenderer); } private static XYDataset asDataset(TimeSeries series) { TimeSeriesCollection dataset = new TimeSeriesCollection(); dataset.addSeries(series); return dataset; } static DateAxis createTimeAxis(String label, SimpleDateFormat dateFormat) { DateAxis timeAxis = new DateAxis(label); timeAxis.setDateFormatOverride(dateFormat); timeAxis.setLowerMargin(MARGIN); timeAxis.setUpperMargin(MARGIN); return timeAxis; } }